/*
 *	ME2 C++ SDK
 *	Copyright (c) 2010 _silencer
 *
 *	Permission is hereby granted, free of charge, to any person
 *	obtaining a copy of this software and associated documentation
 *	files (the "Software"), to deal in the Software without
 *	restriction, including without limitation the rights to use,
 *	copy, modify, merge, publish, distribute, sublicense, and/or sell
 *	copies of the Software, and to permit persons to whom the
 *	Software is furnished to do so, subject to the following
 *	conditions:
 *
 *	The above copyright notice and this permission notice shall be
 *	included in all copies or substantial portions of the Software.
 *
 *	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 *	EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 *	OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 *	NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 *	HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 *	WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 *	FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 *	OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef UNREAL_MOD_H
#define UNREAL_MOD_H

#include "unreal_sdk.h"

namespace unreal
{
	class uengine_mod: private uevent_listener
	{
	public:

		uengine_mod()
			: interface_( uengine_interface::get_singleton() )
		{
			interface_.add_event_listener( this );

			game_engine_ = find_global_object<uobject>( "SFXEngine Transient.SFXEngine" );

			if ( game_engine_->is_valid() )
			{
				std::cout << "Found game engine object!" << std::endl;
			}

			game_viewport_client_ = find_global_object<uobject>( "GFxGameViewportClient GFxGameViewportClient" );

			if ( game_viewport_client_->is_valid() )
			{
				std::cout << "Found game viewport client object!" << std::endl;
			}

			game_viewport_client_post_render_ = find_global_object<ufunction>( "Function GameViewportClient.PostRender" );

			if ( game_viewport_client_post_render_->is_valid() )
			{
				std::cout << "Found game viewport client post render function!" << std::endl;
			}

			game_viewport_client_tick_ = find_global_object<ufunction>( "Function GameViewportClient.Tick" );

			if ( game_viewport_client_tick_->is_valid() )
			{
				std::cout << "Found game viewport client tick function!" << std::endl;
			}
		}

		virtual ~uengine_mod()
		{
			interface_.remove_event_listener( this );
		}

		virtual void on_tick( float delta_time ){}
		virtual void on_post_render( uobject* canvas ){}
		virtual void on_level_change(){}

	protected:

		uengine_interface& interface_;
		uobject* game_engine_;
		uobject* game_viewport_client_;
		ufunction* game_viewport_client_post_render_;
		ufunction* game_viewport_client_tick_;

	private:

		void on_unfiltered_event( uobject* caller, ufunction* function, void* parms, void* result )
		{
			if ( ( function == game_viewport_client_post_render_ ) && parms )
				this->on_post_render( *reinterpret_cast<uobject**>(parms) );
			else
			if ( ( function == game_viewport_client_tick_ ) && parms )
				this->on_tick( *reinterpret_cast<float*>(parms) );
		};

		void on_filtered_caller_event( ufunction* function, void* parms, void* result ){};
		void on_filtered_function_event( uobject* caller, void* parms, void* result ){};
		void on_filtered_event( void* parms, void* result ){};
	};
}

#endif
